package blitting {
	import flash.display.BitmapData;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	/**
	 * @author Charlie MacIsaac
	 */
	public class SpriteSheetRenderer {
		// PROPERTIES =============================================================================
		private var _sheet : BitmapData;
		
		private var _id : String;
		private var _numberOfTiles : uint;
		
		private var _tileBase : Rectangle;
		private var _preCalculateTilePositions : Vector.<Point>;
		
		// GETTERS + SETTERS ======================================================================
		public function get id() : String { return _id; }
		internal function get numberOfTiles() : uint { return _numberOfTiles; }
		internal function get size() : Rectangle { return _tileBase; }
		
		// CONSTRUCTOR ============================================================================
		public function SpriteSheetRenderer(sheet : BitmapData, data : XML) {
			_sheet = sheet;
			
			_id = data.@id;
			_numberOfTiles = data.quantity.@total;
			
			_tileBase = new Rectangle(0, 0, data.size.@width, data.size.@height);
			
			preCalculateTilePositions(data.quantity.@rows, data.quantity.@columns);
		}
		
		// PUBLIC =================================================================================
		public function render(id : uint, drawTo : BitmapData, position : Point) : void {
			_tileBase.x = _preCalculateTilePositions[id].x;
			_tileBase.y = _preCalculateTilePositions[id].y;
			
			drawTo.copyPixels(_sheet, _tileBase, position, null, null, true);
		}
		
		// PRIVATE ================================================================================
		private function preCalculateTilePositions(rows : uint, columns : uint) : void {
			if (!_preCalculateTilePositions) {
				var row : uint, column : uint;
				_preCalculateTilePositions = new Vector.<Point>();
				
				for (var positionIndex : uint = 0 ; positionIndex < _numberOfTiles ; positionIndex++) {
					row = (positionIndex / columns);
					column = positionIndex - (row * rows);
					_preCalculateTilePositions.push(new Point(column * _tileBase.height, row * _tileBase.width));
				}
			}
		}
		
		// LISTENERS ==============================================================================
	}
}